﻿from OpenGL.arrays import vbo
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
from numpy import array
from collections import namedtuple
import sys, math, os

# Klausur SS2010 A8 Wirecube erstellen.
# Man guckt frontal auf xy-Ebene und verschiebt und dreht den Cube entsprechend den vorgaben mit einer Ecke in den Ursprung.
# Und noch so dass man auf die Gegenüberliegende Ecke guckt wenn man die Kamera entsprechend setzt mit gluLookAt().
#
# Hinweis: Koordinatenachsen sind Rot (alle 3 sind zu sehen da Kamera schräg in den Ursprung sieht)
#
# Author: Steinmetz, Trebert

Point = namedtuple('POINT3', ['x', 'y','z'], verbose=False)
origin, e1, e2, e3 = Point(0,0,0), Point(1,0,0), Point(0,1,0), Point(0,0,1)
points = [origin, e1,
          origin, e2,
          origin, e3
          ]
# Achsen
vbo = vbo.VBO(array(points, 'f')) # vbo an Graka schicken

def init(width, height):
   """ Initialize an OpenGL windown and rendering context"""
   glClearColor(1, 1, 1, 1)         # background color
   glMatrixMode(GL_PROJECTION)      # switch to projection matrix
   glLoadIdentity()                 # set to 1
   glOrtho(-2, 2, -2, 2,            # links, rechts, unten, oben
           -3, 3                    # znear, zfar
           )            
   glMatrixMode(GL_MODELVIEW)       # switch to modelview matrix
   
   
def display():
   """Rendering einstellungen"""
   glClear(GL_COLOR_BUFFER_BIT,
           GL_DEPTH_BUFFER_BIT
           ) # resettet angegebenen Buffer
   glLoadIdentity()              # Matrix resetten
   gluLookAt(0, 1, 2**0.5,       # eye Diagonale des Wuerfels auf Z-Achse = sqrt(2)
             0, 0, 0,            # center
             0, 1, 0             # up
             )
   # Wirecube
   glPushMatrix()
   glColor3f(0,0,0)
   glRotatef(-45.0, 0,1,0)
   glTranslatef(0.5, 0.5, 0.5)
   glutWireCube(1)
   glPopMatrix()

   #  Achsen
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
   # Render Vertex Buffer Object
   vbo.bind()
   glVertexPointer(3,      # Anzahl Koordinaten pro Vertex (default 4)
                   GL_FLOAT, # Datentyp der Koordinaten (default GL_FLOAT immer gut)
                   0,      # stride (Byte-Abstand zum naechsten Anfangswert (default 0)
                   vbo    # Pointer auf erstes Element erste Koordinate
                   )
   glEnableClientState(GL_VERTEX_ARRAY)
   glColor(1,0,0)
   glDrawArrays(GL_LINES, 0, 6)
   glDisableClientState(GL_VERTEX_ARRAY)
   vbo.unbind()
   
   # Flush commands  
   glFlush()  
   
def main():
   width, height = 500, 500
   glutInit(sys.argv)
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB )   
   glutInitWindowSize(width, height)
   glutCreateWindow("Test OPENGL Fensterchen")
   glutDisplayFunc(display)     #register display function

   
   # Hack for Mac OS X
#   cwd = os.getcwd()
#   glutInit(sys.argv)
#   os.chdir(cwd)

   init(width, height)#initialize OpenGL state and opengl context
   glutMainLoop()   #start even processing

if __name__ == "__main__":
   main()
